import useStore  from '@/store';
import { defineStore } from 'pinia';
import request from '@/utils/request'
import { ApiRes } from '@/types/data'
import { CartItem } from '@/types/cart'
export default defineStore('cart', {
  state() {
    return {
      list: [] as CartItem[]
    }
  },
  // 开启数据持久化- 针对当前模块
  // persist: true, // 默认是以模块的名字 - key
  persist: {
    key: 'rabbit-cart-99'
  },
  getters: {
    // 登录状态 - 用户
    isLogin(): boolean {
      const { user } = useStore() 
      // token存在 -> 登录( true )  / 不存在 -> 未登录 (false)
      // !! 123 -> true  !!'' false
      // if (user.profile.token) {
      //   return true
      // } else {
      //   return false
      // }
      // return user.profile.token ? true : false
      // Boolean('转换的值')
      return !!user.profile.token
    },
    // 全选框的状态
    isAllSelected(): boolean {
      return this.effectList.length !== 0 && this.effectList.every(item => item.selected)
    },
    // 计算有效的商品列表 isEffective 
    effectList(): CartItem[] {
      return this.list.filter(item => item.isEffective && item.stock > 0)
    },
    // 有效商品的总数量 count累加
    effectListCounts(): number {
      return this.effectList.reduce((sum, item) => sum + item.count, 0)
    },
    // 有效商品的总价格 count * nowPrice  ->  198.00 
    effectListPrice(): string {
      return this.effectList.reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0).toFixed(2)
    },
    // 已选择的商品列表  selected
    selectedList(): CartItem[] {
      return this.effectList.filter(item => item.selected)
    },
    // 已选择的商品总数
    selectedListCounts(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 已选择的商品总价格
    selectedListPrice(): string {
      return this.selectedList.reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0).toFixed(2)
    }
  },
  actions: {
    // 加入购物车
    async addCart(data: CartItem) {
      if (this.isLogin) {
        // 已登录
        // skuId  count
        const { skuId, count } = data
        await request.post('/member/cart', {
          skuId,
          count
        })
        // 重新获取购物车列表的数据
        this.getCartList()
      } else {
        // 未登录
        // console.log('--本地操作 - 加入购物车...--');
        // 1. 判断购物车列表中是否有该商品数据
        const goods = this.list.find(item => item.skuId === data.skuId)
        if (goods) {
          // 2. 如果商品存在于购物车列表中, 直接将数量累加
          goods.count += data.count
        } else {
          // 3. 如果商品不存在..........., 将商品添加到数组中
          this.list.unshift(data)
        }
      }
    },
    // 获取购物车列表数据
    async getCartList() {
      if (this.isLogin) {
        const res = await request.get<ApiRes<CartItem[]>>('/member/cart')
        console.log('--购物车列表数据--', res);
        this.list = res.data.result
      } else {
        // console.log('--本地操作 - 获取购物车列表数据...--');
        // 问题: 不应该从本地中获取 -> 本地中的列表数据不准确 / 库存, 价格, 是否有效
        // 解决: 获取商品的最新信息 
        //       根据商品的skuId, 请求接口, 获取最新的商品信息(库存,....) 
        //  /goods/stock/:id     
        this.list.forEach(async(item) => {
          // 根据skuId 获取商品的最新信息
          const { skuId } = item
          const res = await request.get<ApiRes<CartItem>>(`/goods/stock/${skuId}`)   
          // 保存商品的最新信息  
          const lastCartInfo = res.data.result
          // console.log('-----商品的最新信息', lastCartInfo);
          // 更新商品的现价
          item.nowPrice = (+lastCartInfo.nowPrice).toFixed(2)
          // 更新商品的库存
          item.stock = lastCartInfo.stock
          // 更新商品是否有效
          item.isEffective = lastCartInfo.isEffective
        })
      }
    },
    // 删除购物车商品
    async deleteCart(skuIds: string[]) {
      if (this.isLogin) {
        await request.delete('/member/cart', {
          data: {
            ids: skuIds
          }
        })
        // 重新获取购物车列表的数据
        this.getCartList()
      } else {
        // skuIds ->   
        // 删除的是一个 ['31321']
        // this.list = this.list.filter(item => item.skuId !== skuIds[0] )
        // 删除的是多个 ['123213', '1123123'] 
        // includes() 方法用来判断一个数组是否包含一个指定的值，如果包含则返回 true，否则返回 false。
        this.list = this.list.filter(item => !skuIds.includes(item.skuId))
      }
    },
    // 修改商品(数量 + 状态)
    async updateCart(
         skuId: string,
         data: { selected?: boolean, count?: number }
    ) {
      if (this.isLogin) {
        await request.put(`/member/cart/${skuId}`, data)
        // 重新获取购物车列表的数据
        this.getCartList()
      } else {
        // console.log(data);
        // 1. 找到修改商品的sku
        const sku = this.effectList.find(item => item.skuId === skuId)!
        // 修改商品的数量
        if (data.count) {
          sku.count = data.count
        }
        // 修改商品的状态
        if (data.selected !== undefined) {
          sku.selected = data.selected
        }
      }
    },
    // 修改全选框的状态
    async updateCartAllSelected(isSeleced: boolean) {
      if (this.isLogin) {
        await request.put('/member/cart/selected', {
          selected: isSeleced
        })
        // 获取购物车列表
        this.getCartList()
      } else {
        this.list.forEach(item => {
          item.selected = isSeleced
        })
      }
    },
    // 清空购物车
    clearCart() {
      this.list = [] as CartItem[]
    },
    // 合并购物车
    async mergeCart() {
      const data = this.list.map(({ skuId,selected, count }) => {
        return {
          skuId,
          selected,
          count
        }
      })
      await request.post('/member/cart/merge', data)
      // 如果合并成功 -> 重新获取合并后的购物车列表 
      this.getCartList()
    }
  }
})